"""
Component to control ecoal/esterownik.pl coal/wood boiler controller.

For more details about this component, please refer to the documentation at
https://home-assistant.io/components/ecoal_boiler/
"""
import logging

import voluptuous as vol

from homeassistant.const import (CONF_HOST, CONF_PASSWORD, CONF_USERNAME,
                                 CONF_MONITORED_CONDITIONS, CONF_SENSORS,
                                 CONF_SWITCHES)
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.discovery import load_platform

REQUIREMENTS = ['ecoaliface==0.4.0']

_LOGGER = logging.getLogger(__name__)

DOMAIN = "ecoal_boiler"
DATA_ECOAL_BOILER = 'data_' + DOMAIN

DEFAULT_USERNAME = "admin"
DEFAULT_PASSWORD = "admin"


# Available pump ids with assigned HA names
# Available as switches
AVAILABLE_PUMPS = {
    "central_heating_pump": "Central heating pump",
    "central_heating_pump2": "Central heating pump2",
    "domestic_hot_water_pump": "Domestic hot water pump",
}

# Available temp sensor ids with assigned HA names
# Available as sensors
AVAILABLE_SENSORS = {
    "outdoor_temp": 'Outdoor temperature',
    "indoor_temp": 'Indoor temperature',
    "indoor2_temp": 'Indoor temperature 2',
    "domestic_hot_water_temp": 'Domestic hot water temperature',
    "target_domestic_hot_water_temp": 'Target hot water temperature',
    "feedwater_in_temp": 'Feedwater input temperature',
    "feedwater_out_temp": 'Feedwater output temperature',
    "target_feedwater_temp": 'Target feedwater temperature',
    "fuel_feeder_temp": 'Fuel feeder temperature',
    "exhaust_temp": 'Exhaust temperature',
}

SWITCH_SCHEMA = vol.Schema({
    vol.Optional(CONF_MONITORED_CONDITIONS, default=list(AVAILABLE_PUMPS)):
        vol.All(cv.ensure_list, [vol.In(AVAILABLE_PUMPS)])
})

SENSOR_SCHEMA = vol.Schema({
    vol.Optional(CONF_MONITORED_CONDITIONS, default=list(AVAILABLE_SENSORS)):
        vol.All(cv.ensure_list, [vol.In(AVAILABLE_SENSORS)])
})

CONFIG_SCHEMA = vol.Schema({
    DOMAIN: vol.Schema({
        vol.Required(CONF_HOST): cv.string,
        vol.Optional(CONF_USERNAME,
                     default=DEFAULT_USERNAME): cv.string,
        vol.Optional(CONF_PASSWORD,
                     default=DEFAULT_PASSWORD): cv.string,
        vol.Optional(CONF_SWITCHES, default={}): SWITCH_SCHEMA,
        vol.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA,
    })
}, extra=vol.ALLOW_EXTRA)


def setup(hass, hass_config):
    """Set up global ECoalController instance same for sensors and switches."""
    from ecoaliface.simple import ECoalController

    conf = hass_config[DOMAIN]
    host = conf[CONF_HOST]
    username = conf[CONF_USERNAME]
    passwd = conf[CONF_PASSWORD]
    # Creating ECoalController instance makes HTTP request to controller.
    ecoal_contr = ECoalController(host, username, passwd)
    if ecoal_contr.version is None:
        # Wrong credentials nor network config
        _LOGGER.error("Unable to read controller status from %s@%s"
                      " (wrong host/credentials)", username, host, )
        return False
    _LOGGER.debug("Detected controller version: %r @%s",
                  ecoal_contr.version, host, )
    hass.data[DATA_ECOAL_BOILER] = ecoal_contr
    # Setup switches
    switches = conf[CONF_SWITCHES][CONF_MONITORED_CONDITIONS]
    load_platform(hass, 'switch', DOMAIN, switches, hass_config)
    # Setup temp sensors
    sensors = conf[CONF_SENSORS][CONF_MONITORED_CONDITIONS]
    load_platform(hass, 'sensor', DOMAIN, sensors, hass_config)
    return True
